package top.huhuiyu.ds;

/**
 * 队列---》先进先出
 * 
 * @author Aiden Pearce
 *
 */
public class MyQueue<T> {
  /**
   * 头节点
   */
  private MyNode<T> head;
  /**
   * 尾节点
   */
  private MyNode<T> tail;
  /**
   * 计数
   */
  private int count = 0;

  public boolean isEmpty() {
    return count == 0;
  }

  public int size() {
    return count;
  }

  public T peek() {
    if (isEmpty()) {
      throw new RuntimeException("");
    }
    return head.getData();
  }

  /**
   * 进队（添加到尾部）
   * 
   * @param data
   */
  public void offer(T data) {
    MyNode<T> node = new MyNode<>(data);
    if (isEmpty()) {
      // 没有元素的情况下，头尾都是新进节点
      head = node;
      tail = node;
      count++;
      return;
    }
    // 将新节点加到尾部的next位置
    tail.setNext(node);
    // 新进节点变成尾部
    tail = node;
    count++;

  }

  /**
   * 出队---将头移出队列
   * 
   * @return
   */
  public T poli() {
    if (isEmpty()) {
      throw new RuntimeException("队列为空");
    }
    // 获取头的数据
    T data = head.getData();
    // 将头指向next的节点
    head.getNext();
    // 计数
    count--;
    return data;
  }

}
